package com.lw.common.config;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.jwt.StpLogicJwtForMixin;
import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
import cn.dev33.satoken.jwt.StpLogicJwtForStateless;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
import com.lw.common.utils.CommonUtils;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * sa-token拦截器
 */
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {


    @Resource
    CommonUtils commonUtils;

    // 注册拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册 Sa-Token 拦截器，校验规则为 StpUtil.checkLogin() 登录校验。
        registry.addInterceptor(new SaInterceptor(handle -> {
            SaRouter.match("/**").check(r -> {
                StpUtil.checkLogin();
            }).notMatch("/tbUser/doLogin/");
        })).excludePathPatterns("/swagger-ui/**", "/v3/api-docs/**", "/doc.html/**", "/webjars/**", "/swagger-resources/**", "/favicon.ico"); //knife4j和swagger的静态资源放行
    }

    /**
     * 配置 SA-Token 集成 JWT
     * Simple 简单模式	Mixin 混入模式	Stateless 无状态模式
     * by lw on 二〇二五年五月十七日 22:29:24
     * token模式 :Stateless 无状态模式, Simple 简单模式, Mixin 混入模式 三种模式区别请参考文档[帮助.md]
     */
    @Bean
    public StpLogic getStpLogicJwt() {
        return new StpLogicJwtForStateless(); // Stateless 无状态模式
//        return new StpLogicJwtForSimple();   // Simple 简单模式
//        return new StpLogicJwtForMixin();     // Mixin 混入模式
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        String uploadFilePath = "file:" + commonUtils.getUploadFilePath(null); // 上传文件的路径,例如:"file:D:\\storage-path\"
        registry.addResourceHandler("/static/**").addResourceLocations(uploadFilePath);
    }
}
